﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JoseDiego_Data_Mudanca_Requisito_02
{
	public class DateUtil
	{
		List<DateTime> listHoliday;
		List<DateTime> listDayUtil;

		/// <summary>
		/// DateUtil
		/// </summary>
		public DateUtil()
		{
			loadHoliday();
		}

		/// <summary>
		/// Retorna uma lista com os dias úteis a partir de uma determinada data.
		/// </summary>
		/// <param name="dateSpecific">data inicial da pesquisa.</param>
		/// <param name="amountDays">quantidade de dias corridos.</param>
		/// <returns>retorna X dias úteis.</returns>
		public List<DateTime> ReturnDaysUtils( DateTime dateSpecific, int amountDays )
		{
			try
			{
				if( dateSpecific.Date.Year != 2012 )
				{
					switch( amountDays )
					{
						case 7:
							throw new Exception( "A data informada não é válida, por isso não foi possível retornar os últimos 7 dias úteis." );
							break;
						case 5:
							throw new Exception( "A data informada não é válida, por isso não foi possível retornar os últimos 5 dias úteis." );
							break;
						case 1:
							throw new Exception( "Data inválida." );
							break;
					}				
				}

				listDayUtil = new List<DateTime>();

				DateTime subtractDate = dateSpecific;

				for( int i = 1; listDayUtil.Count < amountDays; i++ )
				{
					subtractDate = subtractDate.AddDays( -1 );

					if( !CheckHoliday( subtractDate ) && subtractDate.DayOfWeek != DayOfWeek.Sunday && subtractDate.DayOfWeek != DayOfWeek.Saturday )
					{
						listDayUtil.Add( subtractDate );
					}
				}
			}
			catch( Exception ex )
			{
				throw ( ex ); 
			}

			return listDayUtil;
		}

		/// <summary>
		/// Verifica se um determinado dia é util.
		/// </summary>
		/// <param name="dateSpecific">data a ser verificada.</param>
		/// <returns>retorna "true" caso o dia seja Util e "false" caso não seja.</returns>
		public Boolean CheckDayUtil(DateTime dateSpecific)
		{
			bool valueReturn = true;

			try
			{
				if( dateSpecific.Date.Year != 2012 )
				{
					throw new Exception( "Favor informar uma data válida" );
				}

				if( CheckHoliday( dateSpecific ) || dateSpecific.DayOfWeek == DayOfWeek.Sunday || dateSpecific.DayOfWeek == DayOfWeek.Saturday )
				{
					valueReturn = false;
				}
				else
				{
					valueReturn = true;
				}
			}
			catch( Exception ex )
			{
				throw ( ex ); 
			}

			return valueReturn;
		}

		/// <summary>
		/// Retorna uma lista os dias Corridos a partir de uma determinada data.
		/// </summary>
		/// <param name="dateSpecific">data inicial da pesquisa.</param>
		/// <param name="amountDays">quantidade de dias corridos.</param>
		/// <returns>retorna X dias corridos.</returns>
		public List<DateTime> ReturnDaysCalendar( DateTime dateSpecific, int amountDays )
		{
			List<DateTime> listDaysCalendar = new List<DateTime>();

			try
			{
				if( dateSpecific.Date.Year != 2012 )
				{
					switch( amountDays )
					{
						case 5:
							throw new Exception( "Não foi possivel os últimos 5 dias corridos, favor informar uma data válida" );
							break;
						case 7:
							throw new Exception( "Favor informar uma data válida" );
							break;
						case 30:
							throw new Exception( "Impossível recuperar os últimos 30 dias corridos  a partir de uma data inválida." );
							break;
					}				
				}

				DateTime subtractDate = dateSpecific;

				for( int i = 1; listDaysCalendar.Count < amountDays; i++ )
				{
					subtractDate = subtractDate.AddDays( -1 );

					listDaysCalendar.Add( subtractDate );
				}
			}
			catch( Exception ex )
			{
				throw ( ex ); 
			}

			return listDaysCalendar;
		}

		/// <summary>
		/// Verifica se uma determinada Data é Feriado.
		/// </summary>
		/// <param name="date">data a ser verificada.</param>
		/// <returns>retorna "true" caso a data seja feriado e "false" caso não seja.</returns>
		public Boolean CheckHoliday( DateTime dateSpecific )
		{
			bool valueReturn = false;

			try
			{
				if( dateSpecific.Date.Year != 2012 )
				{
					throw new Exception( "Favor informar uma data válida" );
				}

				foreach( DateTime dateHol in listHoliday )
				{
					if( dateHol == dateSpecific )
					{
						valueReturn = true;
						break;
					}
				}
			}
			catch( Exception ex )
			{
				throw ( ex ); 
			}

			return valueReturn;
		}

		/// <summary>
		/// Carrega a lista de feriados.
		/// </summary>
		private void loadHoliday()
		{
			listHoliday = new List<DateTime>();

			listHoliday.Add( new DateTime(2012, 01, 01));
			listHoliday.Add( new DateTime(2012, 02, 21));
			listHoliday.Add( new DateTime(2012, 12, 25));
			listHoliday.Add( new DateTime(2012, 12, 31));
		}
	}
}
